package 删除链表中重复的结点;
//在一个排序的链表中，存在重复的结点，请删除该链表中重复的结点，重复的结点不保留，返回链表头指针。
// 例如，链表1->2->3->3->4->4->5 处理后为 1->2->5
public class Solution
{
    
    //这道题目的关键点就在于如何把3-3全部消灭掉，具体思路：
    //
    //判断当前节点和下一个节点之间关系
    //不相等，则直接加入新的链表节点中；
    //相等，则一直找到不等的节点，重新开启上面的判断逻辑，其实就是这么简单。
    public ListNode deleteDuplication(ListNode pHead)
    {

        ListNode p = pHead;
        ListNode newHead = null;//仅代表指针，链表头，到时候好返回，对pnew进行修改就是最链表修改，一样的
        ListNode pnew = null;

        while(p != null){
            if(p.next == null || p.val != p.next.val){
                //尾结点或者不等的情况，此时的尾结点一定是不等的情况，如果最后两个相等，会在下面的else就跳过去了。
                // 它会一直循环到第一个不相等的节点，如果最后是相等的，则直接指向null
                //将新的P节点加入到新队列中
                if(pnew == null){
                    newHead = p;
                    pnew = p;
                }else{
                    pnew.next = p;
                    pnew  = p;
                }
                p = p.next;
            }
            else
                {
                //相等的情况
                ListNode temp = p.next;
                while(temp!= null && temp.val == p.val)
                {
                    temp = temp.next;
                }
                p = temp;
            }
        }//这后面的代码是额外特别写的，针对11233455这种场景，如果不把pnew的next指为null，
        // 那么原始的55就会跟在4的后面导致代码出错。
        if(pnew != null)
            pnew.next = null;
        return newHead;
    }

    public static void main(String[] args)
    {
        ListNode listNode1=new ListNode(1);
        ListNode listNode2=new ListNode(1);
        ListNode listNode3=new ListNode(2);
        ListNode listNode4=new ListNode(3);
        ListNode listNode5=new ListNode(3);
        ListNode listNode6=new ListNode(4);
        ListNode listNode7=new ListNode(5);
        ListNode listNode8=new ListNode(5);
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;
        listNode5.next=listNode6;
        listNode6.next=listNode7;
        listNode7.next=listNode8;
        Solution solution = new Solution();
        System.out.println(solution.deleteDuplication(listNode1));
    }
}
